Skip to content

Commit fae101a

Browse files
committed
perf(fe): reduce size of Call and Index expressions
Replace three words (std::optional<Source_Code_Span>) with one word (Char8*).
1 parent eadab98 commit fae101a

File tree

2 files changed

+37
-8
lines changed

2 files changed

+37
-8
lines changed

src/quick-lint-js/fe/expression.h

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -613,24 +613,38 @@ class Expression::Call final : public Expression {
613613

614614
explicit Call(Expression_Arena::Array_Ptr<Expression *> children,
615615
Source_Code_Span left_paren_span, const Char8 *span_end,
616-
std::optional<Source_Code_Span> optional_chaining_op_)
616+
std::optional<Source_Code_Span> optional_chaining_operator)
617617
: Expression(kind),
618618
call_left_paren_begin_(left_paren_span.begin()),
619619
span_end_(span_end),
620620
children_(children),
621-
optional_chaining_operator_(optional_chaining_op_) {
621+
optional_chaining_operator_begin_(
622+
optional_chaining_operator.has_value()
623+
? optional_chaining_operator->begin()
624+
: nullptr) {
622625
QLJS_ASSERT(left_paren_span.size() == 1);
626+
if (optional_chaining_operator.has_value()) {
627+
QLJS_ASSERT(optional_chaining_operator->size() == 2);
628+
}
623629
}
624630

625631
Source_Code_Span left_paren_span() const {
626632
return Source_Code_Span(this->call_left_paren_begin_,
627633
this->call_left_paren_begin_ + 1);
628634
}
629635

636+
std::optional<Source_Code_Span> optional_chaining_operator_span() const {
637+
if (this->optional_chaining_operator_begin_ == nullptr) {
638+
return std::nullopt;
639+
}
640+
return Source_Code_Span(this->optional_chaining_operator_begin_,
641+
this->optional_chaining_operator_begin_ + 2);
642+
}
643+
630644
const Char8 *call_left_paren_begin_;
631645
const Char8 *span_end_;
632646
Expression_Arena::Array_Ptr<Expression *> children_;
633-
std::optional<Source_Code_Span> optional_chaining_operator_;
647+
const Char8 *optional_chaining_operator_begin_ = nullptr;
634648
};
635649
static_assert(Expression_Arena::is_allocatable<Expression::Call>);
636650

@@ -690,17 +704,32 @@ class Expression::Index final : public Expression {
690704

691705
explicit Index(Expression *container, Expression *subscript,
692706
Source_Code_Span left_square_span, const Char8 *subscript_end,
693-
std::optional<Source_Code_Span> optional_chaining_op_)
707+
std::optional<Source_Code_Span> optional_chaining_operator)
694708
: Expression(kind),
695709
index_subscript_end_(subscript_end),
696710
left_square_span(left_square_span),
697711
children_{container, subscript},
698-
optional_chaining_operator_(optional_chaining_op_) {}
712+
optional_chaining_operator_begin_(
713+
optional_chaining_operator.has_value()
714+
? optional_chaining_operator->begin()
715+
: nullptr) {
716+
if (optional_chaining_operator.has_value()) {
717+
QLJS_ASSERT(optional_chaining_operator->size() == 2);
718+
}
719+
}
720+
721+
std::optional<Source_Code_Span> optional_chaining_operator_span() const {
722+
if (this->optional_chaining_operator_begin_ == nullptr) {
723+
return std::nullopt;
724+
}
725+
return Source_Code_Span(this->optional_chaining_operator_begin_,
726+
this->optional_chaining_operator_begin_ + 2);
727+
}
699728

700729
const Char8 *index_subscript_end_;
701730
Source_Code_Span left_square_span;
702731
std::array<Expression *, 2> children_;
703-
std::optional<Source_Code_Span> optional_chaining_operator_;
732+
const Char8 *optional_chaining_operator_begin_;
704733
};
705734
static_assert(Expression_Arena::is_allocatable<Expression::Index>);
706735

src/quick-lint-js/fe/parse.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,7 @@ void Parser::warn_on_dot_operator_after_optional_chain(Expression::Dot* ast) {
493493
case Expression_Kind::Call: {
494494
auto lhs_call = expression_cast<Expression::Call*>(lhs);
495495
std::optional<Source_Code_Span> lhs_operator_span =
496-
lhs_call->optional_chaining_operator_;
496+
lhs_call->optional_chaining_operator_span();
497497
if (lhs_operator_span.has_value()) {
498498
this->diag_reporter_->report(Diag_Using_Dot_After_Optional_Chaining{
499499
.dot_op = operator_span,
@@ -505,7 +505,7 @@ void Parser::warn_on_dot_operator_after_optional_chain(Expression::Dot* ast) {
505505
case Expression_Kind::Index: {
506506
auto lhs_index = expression_cast<Expression::Index*>(lhs);
507507
std::optional<Source_Code_Span> lhs_operator_span =
508-
lhs_index->optional_chaining_operator_;
508+
lhs_index->optional_chaining_operator_span();
509509
if (lhs_operator_span.has_value()) {
510510
this->diag_reporter_->report(Diag_Using_Dot_After_Optional_Chaining{
511511
.dot_op = operator_span,

0 commit comments

Comments
 (0)