--- a/Cargo.lock +++ b/Cargo.lock @@ -543,8 +543,6 @@ "hashbrown 0.14.5", "jrsonnet-gcmodule", "rustc-hash", - "serde", - "structdump", ] [[package]] @@ -563,9 +561,7 @@ "jrsonnet-gcmodule", "jrsonnet-interner", "peg", - "serde", "static_assertions", - "structdump", ] [[package]] @@ -586,7 +582,6 @@ version = "0.5.0-pre96" dependencies = [ "base64", - "bincode", "jrsonnet-evaluator", "jrsonnet-gcmodule", "jrsonnet-macros", @@ -602,7 +597,6 @@ "sha1", "sha2", "sha3", - "structdump", ] [[package]] @@ -1102,28 +1096,6 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "structdump" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0570327507bf281d8a6e6b0d4c082b12cb6bcee27efce755aa5efacd44076c1" -dependencies = [ - "proc-macro2", - "quote", - "structdump-derive", -] - -[[package]] -name = "structdump-derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29cc0b59cfa11f1bceda09a9a7e37e6a6c3138575fd24ade8aa9af6d09aedf28" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] [[package]] name = "syn" --- a/Cargo.toml +++ b/Cargo.toml @@ -79,7 +79,6 @@ num-bigint = "0.4.5" derivative = "2.2.0" strsim = "0.11.0" -structdump = "0.2.0" proc-macro2 = "1.0" quote = "1.0" syn = "2.0" --- a/crates/jrsonnet-interner/Cargo.toml +++ b/crates/jrsonnet-interner/Cargo.toml @@ -10,20 +10,8 @@ [lints] workspace = true -[features] -default = [] -# Implement value serialization using structdump -structdump = ["dep:structdump"] -# Implement value serialization using serde -# -# Warning: serialized values won't be deduplicated -serde = ["dep:serde"] - [dependencies] jrsonnet-gcmodule.workspace = true - -serde = { workspace = true, optional = true } -structdump = { workspace = true, optional = true } rustc-hash.workspace = true hashbrown = { workspace = true, features = ["inline-more"] } --- a/crates/jrsonnet-interner/src/lib.rs +++ b/crates/jrsonnet-interner/src/lib.rs @@ -219,45 +219,6 @@ } } -#[cfg(feature = "serde")] -impl serde::Serialize for IStr { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - self.as_str().serialize(serializer) - } -} - -#[cfg(feature = "serde")] -impl<'de> serde::Deserialize<'de> for IStr { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - let str = <&str>::deserialize(deserializer)?; - Ok(intern_str(str)) - } -} - -#[cfg(feature = "structdump")] -impl structdump::Codegen for IStr { - fn gen_code( - &self, - res: &mut structdump::CodegenResult, - _unique: bool, - ) -> structdump::TokenStream { - let s: &str = self; - res.add_code( - structdump::quote! { - structdump_import::IStr::from(#s) - }, - Some(structdump::quote![structdump_import::IStr]), - false, - ) - } -} - thread_local! { static POOL: RefCell>> = RefCell::new(HashMap::with_capacity_and_hasher(200, BuildHasherDefault::default())); } --- a/crates/jrsonnet-parser/Cargo.toml +++ b/crates/jrsonnet-parser/Cargo.toml @@ -11,21 +11,6 @@ default = [] exp-destruct = [] exp-null-coaelse = [] -# Implement serialization of AST using structdump -# -# Structdump generates code, which exactly replicated passed AST -# Contrary to serde, has no code bloat problem, and is recommended -# -# The only limitation is serialized form is only useable if built from build script -structdump = ["dep:structdump", "jrsonnet-interner/structdump"] -# Implement serialization of AST using serde -# -# Warning: as serde doesn't deduplicate strings, `Source` struct will bloat -# output binary with repeating source code. To resolve this issue, you should either -# override serialization of this struct using custom `Serializer`/`Deserializer`, -# not rely on Source, and fill its `source_code` with empty value, or use `structdump` -# instead -serde = ["dep:serde"] [dependencies] jrsonnet-interner.workspace = true @@ -34,6 +19,3 @@ static_assertions.workspace = true peg.workspace = true - -serde = { workspace = true, features = ["derive", "rc"], optional = true } -structdump = { workspace = true, features = ["derive"], optional = true } --- a/crates/jrsonnet-parser/src/expr.rs +++ b/crates/jrsonnet-parser/src/expr.rs @@ -6,15 +6,9 @@ use jrsonnet_gcmodule::Trace; use jrsonnet_interner::IStr; -#[cfg(feature = "serde")] -use serde::{Deserialize, Serialize}; -#[cfg(feature = "structdump")] -use structdump::Codegen; use crate::source::Source; -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "structdump", derive(Codegen))] #[derive(Debug, PartialEq, Trace)] pub enum FieldName { /// {fixed: 2} @@ -23,8 +17,6 @@ Dyn(LocExpr), } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, Trace)] #[repr(u8)] pub enum Visibility { @@ -42,13 +34,9 @@ } } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Clone, Debug, PartialEq, Trace)] pub struct AssertStmt(pub LocExpr, pub Option); -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Trace)] pub struct FieldMember { pub name: FieldName, @@ -58,8 +46,6 @@ pub value: LocExpr, } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Trace)] pub enum Member { Field(FieldMember), @@ -67,8 +53,6 @@ AssertStmt(AssertStmt), } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, Trace)] pub enum UnaryOpType { Plus, @@ -93,8 +77,6 @@ } } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, Copy, PartialEq, Eq, Trace)] pub enum BinaryOpType { Mul, @@ -164,14 +146,10 @@ } /// name, default value -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Trace)] pub struct Param(pub Destruct, pub Option); /// Defined function parameters -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Trace)] pub struct ParamsDesc(pub Rc>); @@ -182,8 +160,6 @@ } } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Trace)] pub struct ArgsDesc { pub unnamed: Vec, @@ -195,8 +171,6 @@ } } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Eq, Trace)] pub enum DestructRest { /// ...rest @@ -205,8 +179,6 @@ Drop, } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Trace)] pub enum Destruct { Full(IStr), @@ -268,8 +240,6 @@ } } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Trace)] pub enum BindSpec { Field { @@ -291,26 +261,18 @@ } } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Trace)] pub struct IfSpecData(pub LocExpr); -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Trace)] pub struct ForSpecData(pub Destruct, pub LocExpr); -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Trace)] pub enum CompSpec { IfSpec(IfSpecData), ForSpec(ForSpecData), } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Trace)] pub struct ObjComp { pub pre_locals: Vec, @@ -319,16 +281,12 @@ pub compspecs: Vec, } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Trace)] pub enum ObjBody { MemberList(Vec), ObjComp(ObjComp), } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Eq, Clone, Copy, Trace)] pub enum LiteralType { This, @@ -339,8 +297,6 @@ False, } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Trace)] pub struct SliceDesc { pub start: Option, @@ -349,8 +305,6 @@ } /// Syntax base -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Trace)] pub enum Expr { Literal(LiteralType), @@ -420,8 +374,6 @@ Slice(LocExpr, SliceDesc), } -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Trace)] pub struct IndexPart { pub value: LocExpr, @@ -430,8 +382,6 @@ } /// file, begin offset, end offset -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Clone, PartialEq, Eq, Trace)] #[trace(skip)] #[repr(C)] @@ -452,8 +402,6 @@ } /// Holds AST expression and its location in source file -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "structdump", derive(Codegen))] #[derive(Clone, PartialEq, Trace)] pub struct LocExpr(pub Rc, pub ExprLocation); --- a/crates/jrsonnet-parser/src/source.rs +++ b/crates/jrsonnet-parser/src/source.rs @@ -8,10 +8,6 @@ use jrsonnet_gcmodule::{Trace, Tracer}; use jrsonnet_interner::{IBytes, IStr}; -#[cfg(feature = "serde")] -use serde::{Deserialize, Serialize}; -#[cfg(feature = "structdump")] -use structdump::Codegen; use crate::location::{location_to_offset, offset_to_location, CodeLocation}; @@ -130,31 +126,6 @@ impl Default for SourcePath { fn default() -> Self { Self(Rc::new(SourceDefault)) - } -} - -#[cfg(feature = "structdump")] -impl Codegen for SourcePath { - fn gen_code( - &self, - res: &mut structdump::CodegenResult, - unique: bool, - ) -> structdump::TokenStream { - let source_virtual = self - .0 - .as_any() - .downcast_ref::() - .expect("can only codegen for virtual source paths!") - .0 - .clone(); - let val = res.add_value(source_virtual, false); - res.add_code( - structdump::quote! { - structdump_import::SourcePath::new(structdump_import::SourceVirtual(#val)) - }, - Some(structdump::quote!(SourcePath)), - unique, - ) } } @@ -237,7 +208,6 @@ /// /// It is used for --ext-code=.../--tla-code=.../standard library source code by default, /// and user can construct arbitrary values by hand, without asking import resolver -#[cfg_attr(feature = "structdump", derive(Codegen))] #[derive(Trace, Hash, PartialEq, Eq, Debug, Clone)] pub struct SourceVirtual(pub IStr); impl Display for SourceVirtual { @@ -288,8 +258,6 @@ /// Either real file, or virtual /// Hash of FileName always have same value as raw Path, to make it possible to use with raw_entry_mut -#[cfg_attr(feature = "structdump", derive(Codegen))] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Clone, PartialEq, Eq, Debug)] pub struct Source(pub Rc<(SourcePath, IStr)>); --- a/crates/jrsonnet-stdlib/Cargo.toml +++ b/crates/jrsonnet-stdlib/Cargo.toml @@ -11,14 +11,6 @@ workspace = true [features] -default = ["codegenerated-stdlib"] -# Speed-up initialization by generating code for parsed stdlib, -# instead of invoking parser for it. -# This is mutually exclusive with `serialized-stdlib`. -codegenerated-stdlib = ["jrsonnet-parser/structdump"] -# Use the embedded serialized stdlib. -# This is mutually exclusive with `codegenerated-stdlib`. -serialized-stdlib = [] # Enables legacy `std.thisFile` support, at the cost of worse caching legacy-this-file = [] # Add order preservation flag to some functions @@ -36,9 +28,7 @@ jrsonnet-parser.workspace = true jrsonnet-gcmodule.workspace = true -# Used for stdlib AST serialization -bincode = { workspace = true, optional = true } -# Used both for stdlib AST serialization and std.parseJson/std.parseYaml +# Used for std.parseJson/std.parseYaml serde.workspace = true # std.md5 @@ -65,4 +55,3 @@ [build-dependencies] jrsonnet-parser.workspace = true -structdump = { workspace = true, features = ["derive"] } --- a/crates/jrsonnet-stdlib/build.rs +++ /dev/null @@ -1,36 +0,0 @@ -fn main() { - #[cfg(feature = "codegenerated-stdlib")] - { - use std::{env, fs::File, io::Write, path::Path}; - - use jrsonnet_parser::{parse, ParserSettings, Source}; - use structdump::CodegenResult; - - let parsed = parse( - include_str!("./src/std.jsonnet"), - &ParserSettings { - source: Source::new_virtual( - "".into(), - include_str!("./src/std.jsonnet").into(), - ), - }, - ) - .expect("parse"); - - let mut out = CodegenResult::default(); - - let v = out.codegen(&parsed, true); - - { - let out_dir = env::var("OUT_DIR").unwrap(); - let dest_path = Path::new(&out_dir).join("stdlib.rs"); - let mut f = File::create(dest_path).unwrap(); - f.write_all( - ("#[allow(clippy::redundant_clone, clippy::similar_names)]".to_owned() - + &v.to_string()) - .as_bytes(), - ) - .unwrap(); - } - } -} --- a/crates/jrsonnet-stdlib/src/expr.rs +++ /dev/null @@ -1,109 +0,0 @@ -use jrsonnet_parser::LocExpr; - -pub fn stdlib_expr() -> LocExpr { - #[cfg(all(feature = "serialized-stdlib", feature = "codegenerated-stdlib"))] - compile_error!( - "features `serialized-stdlib` and `codegenerated-stdlib` are mutually exclusive" - ); - #[cfg(all(feature = "serialized-stdlib", not(feature = "codegenerated-stdlib")))] - { - use bincode::{BincodeRead, DefaultOptions, Options}; - use serde::{Deserialize, Deserializer}; - - struct LocDeserializer { - source: Source, - wrapped: bincode::Deserializer, - } - macro_rules! delegate { - ($(fn $name:ident($($arg:ident: $ty:ty),*))+) => {$( - fn $name(mut self $(, $arg: $ty)*, visitor: V) -> Result - where V: serde::de::Visitor<'de>, - { - self.wrapped.$name($($arg,)* visitor) - } - )+}; - } - impl<'de, R, O> Deserializer<'de> for LocDeserializer - where - R: BincodeRead<'de>, - O: Options, - { - type Error = <&'de mut bincode::Deserializer as Deserializer<'de>>::Error; - - delegate! { - fn deserialize_any() - fn deserialize_bool() - fn deserialize_u16() - fn deserialize_u32() - fn deserialize_u64() - fn deserialize_i16() - fn deserialize_i32() - fn deserialize_i64() - fn deserialize_f32() - fn deserialize_f64() - fn deserialize_u128() - fn deserialize_i128() - fn deserialize_u8() - fn deserialize_i8() - fn deserialize_unit() - fn deserialize_char() - fn deserialize_str() - fn deserialize_string() - fn deserialize_bytes() - fn deserialize_byte_buf() - fn deserialize_enum(name: &'static str, variants: &'static [&'static str]) - fn deserialize_tuple(len: usize) - fn deserialize_option() - fn deserialize_seq() - fn deserialize_map() - fn deserialize_struct(name: &'static str, fields: &'static [&'static str]) - fn deserialize_identifier() - fn deserialize_newtype_struct(name: &'static str) - fn deserialize_unit_struct(name: &'static str) - fn deserialize_tuple_struct(name: &'static str, len: usize) - fn deserialize_ignored_any() - } - - fn is_human_readable(&self) -> bool { - false - } - } - - // In build.rs, Source object is populated with empty values, deserializer wrapper loads correct values on deserialize - let mut deserializer = bincode::Deserializer::from_slice( - include_bytes!(concat!(env!("OUT_DIR"), "/stdlib.bincode")), - DefaultOptions::new() - .with_fixint_encoding() - .allow_trailing_bytes(), - ); - - // Should not panic, stdlib.bincode is generated in build.rs - LocExpr::deserialize(&mut deserializer).unwrap() - } - - #[cfg(all(feature = "codegenerated-stdlib", not(feature = "serialized-stdlib")))] - { - mod structdump_import { - pub(super) use std::{option::Option, rc::Rc, vec}; - - pub(super) use jrsonnet_parser::*; - } - - include!(concat!(env!("OUT_DIR"), "/stdlib.rs")) - } - - #[cfg(not(any(feature = "serialized-stdlib", feature = "codegenerated-stdlib")))] - { - use jrsonnet_parser::Source; - - const STDLIB_STR: &str = include_str!("./std.jsonnet"); - - jrsonnet_parser::parse( - STDLIB_STR, - &jrsonnet_parser::ParserSettings { - source: Source::new_virtual("".into(), STDLIB_STR.into()), - }, - ) - .unwrap() - } -} --- a/crates/jrsonnet-stdlib/src/lib.rs +++ b/crates/jrsonnet-stdlib/src/lib.rs @@ -36,7 +36,6 @@ mod arrays; mod compat; mod encoding; -mod expr; mod hash; mod manifest; mod math; @@ -54,14 +53,6 @@ #[allow(clippy::too_many_lines)] pub fn stdlib_uncached(settings: Rc>) -> ObjValue { let mut builder = ObjValueBuilder::new(); - - let expr = expr::stdlib_expr(); - let eval = jrsonnet_evaluator::evaluate(ContextBuilder::dangerous_empty_state().build(), &expr) - .expect("stdlib.jsonnet should have no errors") - .as_obj() - .expect("stdlib.jsonnet should evaluate to object"); - - builder.with_super(eval); // FIXME: Use PHF for (name, builtin) in [ --- a/crates/jrsonnet-stdlib/src/std.jsonnet +++ /dev/null @@ -1,5 +0,0 @@ -{ - local std = self, - - thisFile:: error 'std.thisFile is deprecated, to enable its support in jrsonnet - recompile it with "legacy-this-file" support.\nThis will slow down stdlib caching a bit, though', -}