From d96768d179cb121b0ad1ae6b360f04744e10414b Mon Sep 17 00:00:00 2001 From: Jonathan Tatum Date: Tue, 28 Jul 2026 15:11:22 -0700 Subject: [PATCH] Only report exceeding node count once. PiperOrigin-RevId: 955496224 --- parser/internal/pratt_parser_worker.cc | 7 +++---- parser/internal/pratt_parser_worker.h | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/parser/internal/pratt_parser_worker.cc b/parser/internal/pratt_parser_worker.cc index b37578297..3f842ea80 100644 --- a/parser/internal/pratt_parser_worker.cc +++ b/parser/internal/pratt_parser_worker.cc @@ -198,8 +198,9 @@ void ParserWorker::SynchronizeOnDelimiter() { int64_t ParserWorker::NextId(int32_t position) { int64_t id = next_id_++; - if (id > options_.expression_node_limit) { + if (id > options_.expression_node_limit && !node_limit_exceeded_) { ReportError(position, "expression node limit exceeded"); + node_limit_exceeded_ = true; } if (position >= 0) { positions_.insert({id, position}); @@ -209,9 +210,7 @@ int64_t ParserWorker::NextId(int32_t position) { int64_t ParserWorker::NextId() { return NextId(-1); } -bool ParserWorker::NodeLimitExceeded() { - return next_id_ > options_.expression_node_limit; -} +bool ParserWorker::NodeLimitExceeded() { return node_limit_exceeded_; } int64_t ParserWorker::CopyId(int64_t id) { if (id == 0) { diff --git a/parser/internal/pratt_parser_worker.h b/parser/internal/pratt_parser_worker.h index 2e8534e78..30fdce882 100644 --- a/parser/internal/pratt_parser_worker.h +++ b/parser/internal/pratt_parser_worker.h @@ -98,6 +98,7 @@ class ParserWorker { Token peek_token_; int recursion_depth_ = 0; int64_t next_id_ = 1; + bool node_limit_exceeded_ = false; absl::flat_hash_map positions_; std::vector* absl_nullable parse_issues_; int error_count_ = 0;