difftreelog
feat immutable obj core list
in: master
7 files changed
Cargo.lockdiffbeforeafterboth162source = "registry+https://github.com/rust-lang/crates.io-index"162source = "registry+https://github.com/rust-lang/crates.io-index"163checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"163checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"164165[[package]]166name = "bitmaps"167version = "2.1.0"168source = "registry+https://github.com/rust-lang/crates.io-index"169checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2"170dependencies = [171 "typenum",172]164173165[[package]]174[[package]]166name = "block-buffer"175name = "block-buffer"681source = "registry+https://github.com/rust-lang/crates.io-index"690source = "registry+https://github.com/rust-lang/crates.io-index"682checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"691checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"692693[[package]]694name = "im-rc"695version = "15.1.0"696source = "registry+https://github.com/rust-lang/crates.io-index"697checksum = "af1955a75fa080c677d3972822ec4bad316169ab1cfc6c257a942c2265dbe5fe"698dependencies = [699 "bitmaps",700 "rand_core 0.6.4",701 "rand_xoshiro",702 "sized-chunks",703 "typenum",704 "version_check",705]683706684[[package]]707[[package]]685name = "indexmap"708name = "indexmap"793 "anyhow",816 "anyhow",794 "educe",817 "educe",795 "hi-doc",818 "hi-doc",819 "im-rc",796 "jrsonnet-gcmodule",820 "jrsonnet-gcmodule",797 "jrsonnet-interner",821 "jrsonnet-interner",798 "jrsonnet-ir",822 "jrsonnet-ir",837861838[[package]]862[[package]]839name = "jrsonnet-gcmodule"863name = "jrsonnet-gcmodule"840version = "0.4.2"864version = "0.4.3"841source = "registry+https://github.com/rust-lang/crates.io-index"865source = "registry+https://github.com/rust-lang/crates.io-index"842checksum = "f95b976a79e4000bb9e07ff0709dca0ea27bcf1952d4c17d91fb7364d6145683"866checksum = "8a6a63a6e55ba82764e483d7f8a181f25db95a8f25da8ae6520e95a5fe39c6a6"843dependencies = [867dependencies = [868 "im-rc",844 "jrsonnet-gcmodule-derive",869 "jrsonnet-gcmodule-derive",845]870]846871847[[package]]872[[package]]848name = "jrsonnet-gcmodule-derive"873name = "jrsonnet-gcmodule-derive"849version = "0.4.2"874version = "0.4.3"850source = "registry+https://github.com/rust-lang/crates.io-index"875source = "registry+https://github.com/rust-lang/crates.io-index"851checksum = "51d928626220a310ff0cec815e80cf7fe104697184352ca21c40534e0b0d72d9"876checksum = "095fe3c4c0acf32de80205a8a479ef63c216b9efb0024dec9eb7fe1c5ef1f1a1"852dependencies = [877dependencies = [853 "proc-macro2",878 "proc-macro2",854 "quote",879 "quote",1319checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"1344checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"1320dependencies = [1345dependencies = [1321 "rand_chacha",1346 "rand_chacha",1322 "rand_core",1347 "rand_core 0.9.5",1323]1348]132413491325[[package]]1350[[package]]1329checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"1354checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"1330dependencies = [1355dependencies = [1331 "ppv-lite86",1356 "ppv-lite86",1332 "rand_core",1357 "rand_core 0.9.5",1333]1358]13591360[[package]]1361name = "rand_core"1362version = "0.6.4"1363source = "registry+https://github.com/rust-lang/crates.io-index"1364checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"133413651335[[package]]1366[[package]]1336name = "rand_core"1367name = "rand_core"1341 "getrandom 0.3.4",1372 "getrandom 0.3.4",1342]1373]13741375[[package]]1376name = "rand_xoshiro"1377version = "0.6.0"1378source = "registry+https://github.com/rust-lang/crates.io-index"1379checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa"1380dependencies = [1381 "rand_core 0.6.4",1382]134313831344[[package]]1384[[package]]1345name = "random_color"1385name = "random_color"1586source = "registry+https://github.com/rust-lang/crates.io-index"1626source = "registry+https://github.com/rust-lang/crates.io-index"1587checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa"1627checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa"16281629[[package]]1630name = "sized-chunks"1631version = "0.6.5"1632source = "registry+https://github.com/rust-lang/crates.io-index"1633checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e"1634dependencies = [1635 "bitmaps",1636 "typenum",1637]158816381589[[package]]1639[[package]]1590name = "smallvec"1640name = "smallvec"Cargo.tomldiffbeforeafterboth22jrsonnet-cli = { path = "./crates/jrsonnet-cli", version = "0.5.0-pre98" }22jrsonnet-cli = { path = "./crates/jrsonnet-cli", version = "0.5.0-pre98" }23jrsonnet-types = { path = "./crates/jrsonnet-types", version = "0.5.0-pre98" }23jrsonnet-types = { path = "./crates/jrsonnet-types", version = "0.5.0-pre98" }24jrsonnet-formatter = { path = "./crates/jrsonnet-formatter", version = "0.5.0-pre98" }24jrsonnet-formatter = { path = "./crates/jrsonnet-formatter", version = "0.5.0-pre98" }25jrsonnet-gcmodule = { version = "0.4.2" }25jrsonnet-gcmodule = { version = "0.4.3", features = ["im-rc"] }26# Diagnostics.26# Diagnostics.27# hi-doc is my library, which handles text formatting very well, but isn't polished enough yet27# hi-doc is my library, which handles text formatting very well, but isn't polished enough yet28# Previous implementation was based on annotate-snippets, which I don't like for many reasons.28# Previous implementation was based on annotate-snippets, which I don't like for many reasons.crates/jrsonnet-evaluator/Cargo.tomldiffbeforeafterboth76 "Hash",76 "Hash",77 "PartialEq",77 "PartialEq",78] }78] }79im-rc = "15.1.0"798080[build-dependencies]81[build-dependencies]81rustversion = "1.0.22"82rustversion = "1.0.22"crates/jrsonnet-evaluator/src/evaluate/destructure.rsdiffbeforeafterboth145 let full = full.evaluate()?;145 let full = full.evaluate()?;146 let mut builder = ObjValueBuilder::new();146 let mut builder = ObjValueBuilder::new();147 builder147 builder.extend_with_core(full.as_standalone());148 .reserve_cores(1)149 .extend_with_core(full.as_standalone());150 builder.with_fields_omitted(captured_fields);148 builder.with_fields_omitted(captured_fields);151 Ok(Val::Obj(builder.build()))149 Ok(Val::Obj(builder.build()))crates/jrsonnet-evaluator/src/evaluate/mod.rsdiffbeforeafterboth410 let locals = obj.locals.clone();410 let locals = obj.locals.clone();411 evaluate_comp(ctx, &obj.compspecs, 0, &mut |ctx, reserve| {411 evaluate_comp(ctx, &obj.compspecs, 0, &mut |ctx, reserve| {412 let uctx = evaluate_object_locals(ctx.clone(), locals.clone());412 let uctx = evaluate_object_locals(ctx.clone(), locals.clone());413 builder.reserve_cores(reserve);413 builder.reserve_fields(reserve);414414415 evaluate_field_member(&mut builder, ctx, uctx, &obj.field)415 evaluate_field_member(&mut builder, ctx, uctx, &obj.field)416 })?;416 })?;crates/jrsonnet-evaluator/src/obj/mod.rsdiffbeforeafterboth11};11};121213use educe::Educe;13use educe::Educe;14use im_rc::{Vector, vector};14use jrsonnet_gcmodule::{Acyclic, Cc, Trace, Weak, cc_dyn};15use jrsonnet_gcmodule::{Acyclic, Cc, Trace, Weak, cc_dyn};15use jrsonnet_interner::IStr;16use jrsonnet_interner::IStr;16use jrsonnet_ir::Span;17use jrsonnet_ir::Span;238#[derive(Trace, Educe)]240#[derive(Trace, Educe)]239#[educe(Debug)]241#[educe(Debug)]240struct ObjValueInner {242struct ObjValueInner {241 cores: Vec<CcObjectCore>,243 cores: Vector<CcObjectCore>,242 assertions_ran: Cell<bool>,244 assertions_ran: Cell<bool>,243 has_assertions: bool,245 has_assertions: bool,244 value_cache: RefCell<FxHashMap<(IStr, CoreIdx), CacheValue>>,246 value_cache: RefCell<FxHashMap<(IStr, CoreIdx), CacheValue>>,266268267thread_local! {269thread_local! {268 static EMPTY_OBJ: ObjValue = ObjValue(Cc::new(ObjValueInner {270 static EMPTY_OBJ: ObjValue = ObjValue(Cc::new(ObjValueInner {269 cores: vec![],271 cores: vector![],270 assertions_ran: Cell::new(true),272 assertions_ran: Cell::new(true),271 has_assertions: false,273 has_assertions: false,272 value_cache: RefCell::default(),274 value_cache: RefCell::default(),428 bail!(NoSuperFound)430 bail!(NoSuperFound)429 }431 }430 let mut out = ObjValue::builder();432 let mut out = ObjValue::builder();431 out.reserve_cores(1).extend_with_core(StandaloneSuperCore {433 out.extend_with_core(StandaloneSuperCore {432 sup: self.sup,434 sup: self.sup,433 this: self.this.clone(),435 this: self.this.clone(),434 });436 });484486485 #[must_use]487 #[must_use]486 pub fn extend_from(&self, sup: Self) -> Self {488 pub fn extend_from(&self, sup: Self) -> Self {487 let mut cores = Vec::with_capacity(sup.0.cores.len() + self.0.cores.len());489 let cores = sup.0.cores.clone() + self.0.cores.clone();488 cores.extend(sup.0.cores.iter().cloned());489 cores.extend(self.0.cores.iter().cloned());490 let has_assertions = sup.0.has_assertions || self.0.has_assertions;490 let has_assertions = sup.0.has_assertions || self.0.has_assertions;491 ObjValue(Cc::new(ObjValueInner {491 ObjValue(Cc::new(ObjValueInner {492 cores,492 cores,522 )522 )523 }523 }524525 fn iter_cores(&self, idx: CoreIdx) -> impl Iterator<Item = &CcObjectCore> {526 self.0.cores.iter().take(idx.idx).rev()527 }528 fn iter_cores_enumerate(&self, idx: CoreIdx) -> impl Iterator<Item = (CoreIdx, &CcObjectCore)> {529 self.0530 .cores531 .iter()532 .take(idx.idx)533 .enumerate()534 .rev()535 .map(|(idx, o)| (CoreIdx { idx }, o))536 }537524 fn enum_fields_idx(538 fn enum_fields_idx(525 &self,539 &self,526 super_depth: &mut SuperDepth,540 super_depth: &mut SuperDepth,527 handler: &mut EnumFieldsHandler<'_>,541 handler: &mut EnumFieldsHandler<'_>,528 idx: CoreIdx,542 idx: CoreIdx,529 ) -> bool {543 ) -> bool {530 for core in self.0.cores[..idx.idx].iter().rev() {544 for core in self.iter_cores(idx) {531 if !core.0.enum_fields_core(super_depth, handler) {545 if !core.0.enum_fields_core(super_depth, handler) {532 return false;546 return false;533 }547 }546 }560 }547 fn has_field_include_hidden_idx(&self, name: IStr, core: CoreIdx) -> bool {561 fn has_field_include_hidden_idx(&self, name: IStr, core: CoreIdx) -> bool {548 let mut skip = Saturating(0usize);562 let mut skip = Saturating(0usize);549 for ele in self.0.cores[..core.idx].iter().rev() {563 for ele in self.iter_cores(core) {550 match ele.0.has_field_include_hidden_core(name.clone()) {564 match ele.0.has_field_include_hidden_core(name.clone()) {551 HasFieldIncludeHidden::Exists => {565 HasFieldIncludeHidden::Exists => {552 if skip.0 == 0 {566 if skip.0 == 0 {616 let mut first_add = None;630 let mut first_add = None;617 let mut add_stack: Vec<Val> = Vec::new();631 let mut add_stack: Vec<Val> = Vec::new();618 let mut skip = Saturating(0);632 let mut skip = Saturating(0);619 for (sup, core) in self.0.cores[..core.idx].iter().enumerate().rev() {633 for (sup, core) in self.iter_cores_enumerate(core) {620 let sup_this = SupThis {634 let sup_this = SupThis {621 sup: CoreIdx { idx: sup },635 sup,622 this: self.clone(),636 this: self.clone(),623 };637 };624 match core.0.get_for_core(key.clone(), sup_this, skip.0 != 0)? {638 match core.0.get_for_core(key.clone(), sup_this, skip.0 != 0)? {686 fn field_visibility_idx(&self, field: IStr, core: CoreIdx) -> Option<Visibility> {700 fn field_visibility_idx(&self, field: IStr, core: CoreIdx) -> Option<Visibility> {687 let mut exists = false;701 let mut exists = false;688 let mut skip = Saturating(0usize);702 let mut skip = Saturating(0usize);689 for ele in self.0.cores[..core.idx].iter().rev() {703 for ele in self.iter_cores(core) {690 let vis = ele.0.field_visibility_core(field.clone());704 let vis = ele.0.field_visibility_core(field.clone());691 match vis {705 match vis {692 FieldVisibility::Found(vis @ (Visibility::Unhide | Visibility::Hidden)) => {706 FieldVisibility::Found(vis @ (Visibility::Unhide | Visibility::Hidden)) => {crates/jrsonnet-evaluator/src/obj/oop.rsdiffbeforeafterboth4 ops::ControlFlow,4 ops::ControlFlow,5};5};667use im_rc::Vector;7use jrsonnet_gcmodule::{Cc, Trace};8use jrsonnet_gcmodule::{Cc, Trace};8use jrsonnet_ir::IStr;9use jrsonnet_ir::IStr;9use rustc_hash::{FxHashMap, FxHashSet};10use rustc_hash::{FxHashMap, FxHashSet};117118118#[allow(clippy::module_name_repetitions)]119#[allow(clippy::module_name_repetitions)]119pub struct ObjValueBuilder {120pub struct ObjValueBuilder {120 sup: Vec<CcObjectCore>,121 sup: Vector<CcObjectCore>,121 has_assertions: bool,122 has_assertions: bool,122123123 new: OopObject,124 new: OopObject,129 }130 }130 pub fn with_capacity(capacity: usize) -> Self {131 pub fn with_capacity(capacity: usize) -> Self {131 Self {132 Self {132 sup: vec![],133 sup: Vector::new(),133 has_assertions: false,134 has_assertions: false,134 new: OopObject::new(FxHashMap::with_capacity(capacity), None),135 new: OopObject::new(FxHashMap::with_capacity(capacity), None),135 next_field_index: FieldIndex::default(),136 next_field_index: FieldIndex::default(),138 pub fn reserve_fields(&mut self, capacity: usize) {139 pub fn reserve_fields(&mut self, capacity: usize) {139 self.new.this_entries.reserve(capacity);140 self.new.this_entries.reserve(capacity);140 }141 }141 pub fn reserve_cores(&mut self, capacity: usize) -> &mut Self {142 self.sup.reserve_exact(capacity);143 self144 }145 pub fn with_super(&mut self, super_obj: ObjValue) -> &mut Self {142 pub fn with_super(&mut self, super_obj: ObjValue) -> &mut Self {146 self.has_assertions |= super_obj.0.has_assertions;143 self.has_assertions |= super_obj.0.has_assertions;147 self.sup.clone_from(&super_obj.0.cores);144 self.sup = super_obj.0.cores.clone();148 self145 self149 }146 }150147181178182 pub fn extend_with_core(&mut self, core: impl ObjectCore) {179 pub fn extend_with_core(&mut self, core: impl ObjectCore) {183 self.commit();180 self.commit();184 self.sup.push(CcObjectCore::new(core));181 self.sup.push_back(CcObjectCore::new(core));185 }182 }186183187 fn commit(&mut self) {184 fn commit(&mut self) {188 if !self.new.is_empty() {185 if !self.new.is_empty() {189 self.sup.push(CcObjectCore::new(mem::take(&mut self.new)));186 self.sup187 .push_back(CcObjectCore::new(mem::take(&mut self.new)));190 }188 }191 self.next_field_index = FieldIndex::default();189 self.next_field_index = FieldIndex::default();192 }190 }193191194 pub fn with_fields_omitted(&mut self, omit: FxHashSet<IStr>) {192 pub fn with_fields_omitted(&mut self, omit: FxHashSet<IStr>) {195 self.commit();193 self.commit();196 self.sup.push(CcObjectCore::new(OmitFieldsCore {194 self.sup.push_back(CcObjectCore::new(OmitFieldsCore {197 omit,195 omit,198 prev_layers: self.sup.len(),196 prev_layers: self.sup.len(),199 }));197 }));