Skip to content

Commit ebfa705

Browse files
bors[bot]Marwes
andauthored
Merge #833
833: Optimize the parser r=Marwes a=Marwes Gives a 10-16% improvement (on benchmarks) bors r+ Co-authored-by: Markus Westerlind <[email protected]>
2 parents ba08b85 + f2fc254 commit ebfa705

File tree

24 files changed

+1183
-830
lines changed

24 files changed

+1183
-830
lines changed

Cargo.lock

Lines changed: 743 additions & 552 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@ path = "examples/lisp/main.rs"
143143
[package.metadata.docs.rs]
144144
features = ["docs_rs"]
145145

146-
[profile.bench]
147-
debug = 1
148-
149-
[profile.release]
150-
debug = 1
146+
# [profile.bench]
147+
# debug = 2
148+
#
149+
# [profile.release]
150+
# debug = 2

base/src/ast.rs

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use crate::{
1919

2020
use crate::{
2121
kind::ArcKind,
22-
metadata::{Comment, Metadata},
22+
metadata::{BaseMetadata, Comment, Metadata},
2323
pos::{self, BytePos, HasSpan, Span, Spanned},
2424
resolve::remove_aliases_cow,
2525
symbol::Symbol,
@@ -78,7 +78,7 @@ impl<'a, T: ?Sized + IdentEnv> IdentEnv for &'a mut T {
7878

7979
#[derive(Eq, PartialEq, Debug, AstClone)]
8080
pub struct InnerAstType<'ast, Id> {
81-
metadata: Option<Metadata>,
81+
metadata: BaseMetadata<'ast>,
8282
typ: Spanned<Type<Id, AstType<'ast, Id>>, BytePos>,
8383
}
8484

@@ -137,7 +137,7 @@ pub trait HasMetadata {
137137

138138
impl<Id> HasMetadata for AstType<'_, Id> {
139139
fn metadata(&self) -> Option<&Metadata> {
140-
self._typ.metadata.as_ref()
140+
self._typ.metadata.metadata.as_ref().map(|m| &**m)
141141
}
142142
}
143143

@@ -148,7 +148,7 @@ impl<'ast, Id> AstType<'ast, Id> {
148148
) -> Self {
149149
AstType {
150150
_typ: arena.alloc(InnerAstType {
151-
metadata: None,
151+
metadata: Default::default(),
152152
typ,
153153
}),
154154
}
@@ -164,7 +164,7 @@ impl<'ast, Id> AstType<'ast, Id> {
164164
typ: Spanned<Type<Id, AstType<'ast, Id>>, BytePos>,
165165
) -> Self
166166
where
167-
T: Into<Option<Metadata>>,
167+
T: Into<BaseMetadata<'ast>>,
168168
{
169169
AstType {
170170
_typ: arena.alloc(InnerAstType {
@@ -176,7 +176,7 @@ impl<'ast, Id> AstType<'ast, Id> {
176176

177177
pub fn set_metadata<T>(&mut self, metadata: T)
178178
where
179-
T: Into<Option<Metadata>>,
179+
T: Into<BaseMetadata<'ast>>,
180180
{
181181
self._typ.metadata = metadata.into();
182182
}
@@ -308,6 +308,10 @@ pub enum Pattern<'ast, Id> {
308308
Error,
309309
}
310310

311+
// Safeguard against growing Pattern
312+
#[cfg(target_pointer_width = "64")]
313+
const _: [u8; 48] = [0; std::mem::size_of::<Pattern<'static, Symbol>>()];
314+
311315
pub fn pattern_names<'a, 'ast, Id>(
312316
fields: &'a [PatternField<'ast, Id>],
313317
) -> impl Iterator<Item = &'a Spanned<Id, BytePos>> + Captures<'ast> {
@@ -355,10 +359,6 @@ pub fn pattern_types<'a, 'ast, Id>(
355359
})
356360
}
357361

358-
// Safeguard against growing Pattern
359-
#[cfg(target_pointer_width = "64")]
360-
const _: [u8; 48] = [0; std::mem::size_of::<Pattern<'static, Symbol>>()];
361-
362362
impl<Id> Default for Pattern<'_, Id> {
363363
fn default() -> Self {
364364
Pattern::Error
@@ -393,8 +393,8 @@ pub type SpannedAlias<'ast, Id> = Spanned<AliasData<Id, AstType<'ast, Id>>, Byte
393393
pub type SpannedAstType<'ast, Id> = Spanned<Type<Id, AstType<'ast, Id>>, BytePos>;
394394

395395
#[derive(Eq, PartialEq, Debug, AstClone)]
396-
pub struct ExprField<Id, E> {
397-
pub metadata: Metadata,
396+
pub struct ExprField<'ast, Id, E> {
397+
pub metadata: BaseMetadata<'ast>,
398398
pub name: Spanned<Id, BytePos>,
399399
pub value: Option<E>,
400400
}
@@ -447,8 +447,8 @@ pub enum Expr<'ast, Id> {
447447
/// Record construction
448448
Record {
449449
typ: ArcType<Id>,
450-
types: &'ast mut [ExprField<Id, ArcType<Id>>],
451-
exprs: &'ast mut [ExprField<Id, SpannedExpr<'ast, Id>>],
450+
types: &'ast mut [ExprField<'ast, Id, ArcType<Id>>],
451+
exprs: &'ast mut [ExprField<'ast, Id, SpannedExpr<'ast, Id>>],
452452
base: Option<&'ast mut SpannedExpr<'ast, Id>>,
453453
},
454454
/// Tuple construction
@@ -591,7 +591,7 @@ impl<'ast, Id> Expr<'ast, Id> {
591591

592592
#[derive(Eq, PartialEq, Debug, AstClone)]
593593
pub struct TypeBinding<'ast, Id> {
594-
pub metadata: Metadata,
594+
pub metadata: BaseMetadata<'ast>,
595595
pub name: Spanned<Id, BytePos>,
596596
pub alias: SpannedAlias<'ast, Id>,
597597
pub finalized_alias: Option<Alias<Id, ArcType<Id>>>,
@@ -680,7 +680,7 @@ impl<'a, 'ast, Id> IntoIterator for &'a mut ValueBindings<'ast, Id> {
680680

681681
#[derive(Eq, PartialEq, Debug, AstClone)]
682682
pub struct ValueBinding<'ast, Id> {
683-
pub metadata: Metadata,
683+
pub metadata: BaseMetadata<'ast>,
684684
pub name: SpannedPattern<'ast, Id>,
685685
pub typ: Option<AstType<'ast, Id>>,
686686
pub resolved_type: ArcType<Id>,
@@ -1272,8 +1272,8 @@ impl_ast_arena! {
12721272
SpannedExpr<'ast, Id> => exprs,
12731273
SpannedPattern<'ast, Id> => patterns,
12741274
PatternField<'ast, Id> => pattern_field,
1275-
ExprField<Id, ArcType<Id>> => expr_field_types,
1276-
ExprField<Id, SpannedExpr<'ast, Id>> => expr_field_exprs,
1275+
ExprField<'ast, Id, ArcType<Id>> => expr_field_types,
1276+
ExprField<'ast, Id, SpannedExpr<'ast, Id>> => expr_field_exprs,
12771277
TypeBinding<'ast, Id> => type_bindings,
12781278
ValueBinding<'ast, Id> => value_bindings,
12791279
Do<'ast, Id> => do_exprs,
@@ -1284,6 +1284,7 @@ impl_ast_arena! {
12841284
Generic<Id> => generics,
12851285
Field<Id, AstType<'ast, Id>> => type_fields,
12861286
Field<Id, Alias<Id, AstType<'ast, Id>>> => type_type_fields,
1287+
Metadata => metadata,
12871288
}
12881289

12891290
pub struct RootExpr<Id: 'static> {
@@ -1494,7 +1495,8 @@ impl<'ast, Id, T> AstClone<'ast, Id> for PhantomData<T> {
14941495
impl<'ast, Id, T> AstClone<'ast, Id> for Arc<[crate::types::AliasData<Id, T>]>
14951496
where
14961497
Id: Clone + AstClone<'ast, Id>,
1497-
T: AstClone<'ast, Id>,
1498+
T: AstClone<'ast, Id> + TypePtr<Id = Id>,
1499+
T::Generics: AstClone<'ast, Id>,
14981500
{
14991501
fn ast_clone(&self, arena: ArenaRef<'_, 'ast, Id>) -> Self {
15001502
Arc::from(self.iter().map(|e| e.ast_clone(arena)).collect::<Vec<_>>())

base/src/metadata.rs

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{collections::BTreeMap, fmt, sync::Arc};
1+
use std::{collections::BTreeMap, fmt, mem, sync::Arc};
22

33
use crate::{
44
ast::Argument,
@@ -52,6 +52,17 @@ impl fmt::Display for Attribute {
5252
}
5353
}
5454

55+
#[derive(Debug, Default, Eq, PartialEq, Hash, gluon_codegen::AstClone)]
56+
pub struct BaseMetadata<'ast> {
57+
pub metadata: Option<&'ast mut Metadata>,
58+
}
59+
60+
impl From<BaseMetadata<'_>> for Metadata {
61+
fn from(meta: BaseMetadata<'_>) -> Self {
62+
meta.metadata.map(|m| m.clone()).unwrap_or_default()
63+
}
64+
}
65+
5566
#[derive(Clone, Debug, Default, Eq, PartialEq, Hash)]
5667
#[cfg_attr(feature = "serde_derive", derive(Deserialize, Serialize))]
5768
pub struct Metadata {
@@ -124,6 +135,17 @@ impl Metadata {
124135
}
125136
}
126137

138+
pub fn merge_with_base(mut self, other: &BaseMetadata<'_>) -> Self {
139+
self.merge_with_base_ref(other);
140+
self
141+
}
142+
143+
pub fn merge_with_base_ref(&mut self, other: &BaseMetadata<'_>) {
144+
if let Some(other) = &other.metadata {
145+
self.merge_with_ref(other);
146+
}
147+
}
148+
127149
pub fn get_attribute(&self, name: &str) -> Option<&str> {
128150
self.attributes()
129151
.find(|attribute| attribute.name == name)
@@ -134,3 +156,41 @@ impl Metadata {
134156
self.attributes.iter()
135157
}
136158
}
159+
160+
impl<'ast> BaseMetadata<'ast> {
161+
pub fn has_data(&self) -> bool {
162+
self.metadata.is_some()
163+
}
164+
165+
pub fn merge(&mut self, metadata: BaseMetadata<'ast>) {
166+
match &mut self.metadata {
167+
Some(self_) => {
168+
if let Some(metadata) = metadata.metadata {
169+
self_.merge_with(mem::take(metadata));
170+
}
171+
}
172+
None => *self = metadata,
173+
}
174+
}
175+
176+
pub fn comment(&self) -> Option<&Comment> {
177+
self.metadata.as_ref().and_then(|m| m.comment.as_ref())
178+
}
179+
180+
pub fn get_attribute(&self, name: &str) -> Option<&str> {
181+
self.attributes()
182+
.find(|attribute| attribute.name == name)
183+
.map(|t| t.arguments.as_ref().map_or("", |s| s))
184+
}
185+
186+
pub fn attributes(&self) -> impl Iterator<Item = &Attribute> {
187+
self.metadata.iter().flat_map(|m| m.attributes())
188+
}
189+
190+
pub fn to_metadata(&self) -> Metadata {
191+
self.metadata
192+
.as_ref()
193+
.map(|m| (**m).clone())
194+
.unwrap_or_default()
195+
}
196+
}

base/src/pos.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ impl fmt::Display for Location {
4040
}
4141
}
4242

43+
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Default)]
44+
pub struct Positioned<T, Pos> {
45+
pub pos: Pos,
46+
pub value: T,
47+
}
48+
4349
#[derive(Copy, Clone, Debug, Eq, PartialEq, Default)]
4450
pub struct Spanned<T, Pos> {
4551
pub span: Span<Pos>,

base/src/serialization.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::serde::ser::{SerializeState, Serializer};
1313

1414
use crate::kind::ArcKind;
1515
use crate::symbol::Symbol;
16-
use crate::types::{AliasData, ArcType, Type, TypeExt, TypePtr};
16+
use crate::types::{AliasData, ArcType, Generic, Type, TypeExt, TypePtr};
1717

1818
#[derive(Default)]
1919
pub struct SeSeed {
@@ -88,6 +88,7 @@ where
8888
+ Clone
8989
+ ::std::any::Any
9090
+ DeserializeState<'de, Seed<Id, T>>,
91+
T::Generics: Default + Extend<Generic<Id>> + Clone,
9192
{
9293
let seed = SharedSeed::new(seed);
9394
DeserializeSeed::deserialize(seed, deserializer).map(|vec: Vec<_>| Arc::from(vec))

0 commit comments

Comments
 (0)