���� JFIF �� � ( %"1"%)+...383,7(-.-
![]() Server : Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.20 System : Linux st2.domain.com 3.10.0-1127.10.1.el7.x86_64 #1 SMP Wed Jun 3 14:28:03 UTC 2020 x86_64 User : apache ( 48) PHP Version : 7.4.20 Disable Function : NONE Directory : /home/real/node-v13.0.1/deps/v8/src/ast/ |
// Copyright 2018 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/ast/source-range-ast-visitor.h" #include "src/ast/ast-source-ranges.h" namespace v8 { namespace internal { SourceRangeAstVisitor::SourceRangeAstVisitor(uintptr_t stack_limit, Expression* root, SourceRangeMap* source_range_map) : AstTraversalVisitor(stack_limit, root), source_range_map_(source_range_map) {} void SourceRangeAstVisitor::VisitBlock(Block* stmt) { AstTraversalVisitor::VisitBlock(stmt); ZonePtrList<Statement>* stmts = stmt->statements(); AstNodeSourceRanges* enclosingSourceRanges = source_range_map_->Find(stmt); if (enclosingSourceRanges != nullptr) { CHECK(enclosingSourceRanges->HasRange(SourceRangeKind::kContinuation)); MaybeRemoveLastContinuationRange(stmts); } } void SourceRangeAstVisitor::VisitSwitchStatement(SwitchStatement* stmt) { AstTraversalVisitor::VisitSwitchStatement(stmt); ZonePtrList<CaseClause>* clauses = stmt->cases(); for (CaseClause* clause : *clauses) { MaybeRemoveLastContinuationRange(clause->statements()); } } void SourceRangeAstVisitor::VisitFunctionLiteral(FunctionLiteral* expr) { AstTraversalVisitor::VisitFunctionLiteral(expr); ZonePtrList<Statement>* stmts = expr->body(); MaybeRemoveLastContinuationRange(stmts); } bool SourceRangeAstVisitor::VisitNode(AstNode* node) { AstNodeSourceRanges* range = source_range_map_->Find(node); if (range == nullptr) return true; if (!range->HasRange(SourceRangeKind::kContinuation)) return true; // Called in pre-order. In case of conflicting continuation ranges, only the // outermost range may survive. SourceRange continuation = range->GetRange(SourceRangeKind::kContinuation); if (continuation_positions_.find(continuation.start) != continuation_positions_.end()) { range->RemoveContinuationRange(); } else { continuation_positions_.emplace(continuation.start); } return true; } void SourceRangeAstVisitor::MaybeRemoveLastContinuationRange( ZonePtrList<Statement>* statements) { if (statements->is_empty()) return; Statement* last_statement = statements->last(); AstNodeSourceRanges* last_range = nullptr; if (last_statement->IsExpressionStatement() && last_statement->AsExpressionStatement()->expression()->IsThrow()) { // For ThrowStatement, source range is tied to Throw expression not // ExpressionStatement. last_range = source_range_map_->Find( last_statement->AsExpressionStatement()->expression()); } else { last_range = source_range_map_->Find(last_statement); } if (last_range == nullptr) return; if (last_range->HasRange(SourceRangeKind::kContinuation)) { last_range->RemoveContinuationRange(); } } } // namespace internal } // namespace v8