5#ifndef V8_PARSING_PARSER_H_
6#define V8_PARSING_PARSER_H_
32class ConsumedPreparseData;
35class ParserTargetScope;
36class PendingCompilationErrorHandler;
72 return pattern->AsVariableProxy()->raw_name();
136 delete reusable_preparser_;
137 reusable_preparser_ =
nullptr;
145 int end_position,
int function_literal_id);
149 void InitializeEmptyScopeChain(
ParseInfo* info);
159 template <
typename IsolateT>
160 void DeserializeScopeChain(
164 Scope::DeserializationMode::kScopesOnly);
168 void UpdateStatistics(
171 int* preparse_skipped);
172 template <
typename IsolateT>
191 return !MaybeParsingArrowhead() &&
192 scope()->AllowsLazyParsingWithoutUnresolvedVariables(
197 enum Mode { PARSE_LAZILY, PARSE_EAGERLY };
220 return scope()->NewTemporary(name);
223 void PrepareGeneratorVariables();
234 template <
typename IsolateT>
235 void PostProcessParseResult(IsolateT* isolate,
ParseInfo* info,
239 int start_position,
int end_position,
240 int function_literal_id,
244 FunctionKind initializer_kind,
int initializer_pos,
int initializer_id,
245 int initializer_end_pos,
const AstRawString* class_name);
266 if (reusable_preparser_ ==
nullptr) {
268 &preparser_zone_, &scanner_,
stack_limit_, ast_value_factory(),
269 pending_error_handler(), runtime_call_stats_, v8_file_logger_,
270 flags(), parsing_on_main_thread_);
271 reusable_preparser_->set_allow_eval_cache(allow_eval_cache());
272 preparse_data_buffer_.reserve(128);
274 return reusable_preparser_;
280 void ParseImportDeclaration();
283 void ParseExportStar();
298 : import_name(import_name),
299 local_name(local_name),
300 location(location) {}
306 Statement* BuildInitializationBlock(DeclarationParsingResult* parsing_result);
309 Block* RewriteCatchPattern(CatchInfo* catch_info);
313 Block* finally_block,
315 const CatchInfo& catch_info,
int pos);
320 void DeclareFunctionNameVar(
const AstRawString* function_name,
329 ClassInfo* class_info,
337 int function_literal_id,
347 int class_token_pos,
int end_pos);
349 ClassInfo* class_info,
int class_token_pos);
351 int class_token_pos);
353 ClassInfo* class_info,
bool is_static);
354 void DeclarePrivateClassMember(
ClassScope* scope,
358 bool is_static, ClassInfo* class_info);
359 void DeclarePublicClassMethod(
const AstRawString* class_name,
361 bool is_constructor, ClassInfo* class_info);
362 void DeclarePublicClassField(
ClassScope* scope,
364 bool is_computed_name, ClassInfo* class_info);
367 ClassInfo* class_info);
370 bool is_computed_name,
bool is_private,
371 ClassInfo* class_info);
372 void AddClassStaticBlock(
Block* block, ClassInfo* class_info);
374 ClassInfo* class_info);
376 ClassInfo* class_info);
379 ClassInfo* class_info,
int pos);
385 return scope()->GetDeclarationScope()->has_checked_syntax();
388 void InitializeVariables(
390 const DeclarationParsingResult::Declaration*
declaration);
392 Block* RewriteForVarInLegacy(
const ForInfo& for_info);
393 void DesugarBindingInForEachStatement(ForInfo* for_info,
Block** body_block,
395 Block* CreateForEachStatementTDZ(
Block* init_block,
const ForInfo& for_info);
397 Statement* DesugarLexicalBindingsInForStatement(
410 return object_literal;
415 void InsertShadowingVarBindingInitializers(
Block* block);
427 bool* was_added,
int initializer_position);
431 Scope* declaration_scope,
bool* was_added,
432 int begin,
int end = kNoSourcePosition);
435 Scope* declaration_scope,
bool* was_added,
int var_begin_pos,
436 int var_end_pos = kNoSourcePosition);
444 bool is_static,
int pos);
448 bool is_static,
int pos);
451 ClassInfo* class_info,
453 bool is_static,
int pos);
457 bool is_private,
int pos);
471 int* function_length,
474 Block* BuildParameterInitializationBlock(
481 int* function_length,
bool* has_duplicate_parameters,
482 int* expected_property_count,
int* suspend_count,
490 : cooked_(8, zone), raw_(8, zone), expressions_(8, zone),
pos_(
pos) {}
500 cooked_.Add(cooked, zone);
505 expressions_.Add(expression, zone);
534#if V8_ENABLE_WEBASSEMBLY
555 return identifier == ast_value_factory()->eval_string();
559 return identifier == ast_value_factory()->async_string();
563 return identifier == ast_value_factory()->arguments_string();
573 Property*
property = expression->AsProperty();
574 return property !=
nullptr &&
property->
obj()->IsThisExpression();
580 Property*
property = expression->AsProperty();
581 if (expression->IsOptionalChain()) {
582 Expression* expr_inner = expression->AsOptionalChain()->expression();
583 property = expr_inner->AsProperty();
597 DCHECK(IsIdentifier(expression));
598 return expression->AsVariableProxy()->raw_name();
602 return expression->AsVariableProxy();
606 return identifier == ast_value_factory()->constructor_string();
611 return !
property->IsPrototype();
620 return expr->IsVariableProxy() &&
621 expr->AsVariableProxy()->raw_name() ==
622 ast_value_factory()->native_string();
627 return string->AsArrayIndex(index);
636 if (e_stat ==
nullptr)
return false;
639 return arg ==
nullptr ||
literal->AsRawString() == arg;
644 *default_string = ast_value_factory()->default_string();
645 *dot_default_string = ast_value_factory()->dot_default_string();
651 fni_.PushLiteralName(
id);
655 fni_.PushVariableName(
id);
659 if (expression->IsPropertyName()) {
660 fni_.PushLiteralName(expression->AsLiteral()->AsRawPropertyName());
662 fni_.PushLiteralName(ast_value_factory()->computed_string());
667 fni_.PushEnclosingName(name);
671 fni_.AddFunction(func_to_infer);
681 if (left->IsProperty() && right->IsFunctionLiteral()) {
682 right->AsFunctionLiteral()->set_pretenure();
717 return NewThrowError(Runtime::kNewReferenceError, message,
718 ast_value_factory()->empty_string(),
pos);
740 void ReportUnexpectedTokenAt(
758 template <
typename T>
760 return subject ==
nullptr;
769 return ast_value_factory()->empty_string();
786 return scanner()->NextSymbol(ast_value_factory());
790 double double_value = scanner()->DoubleValue();
792 std::string_view
string =
794 return ast_value_factory()->GetOneByteString(
795 base::OneByteVector(
string.
data(),
string.
length()));
802 return factory()->ThisExpression();
807 return factory()->NewThisExpression(
pos);
819 int start_position) {
820 VariableProxy* proxy = factory()->ast_node_factory()->NewVariableProxy(
829 if (infer == InferName::kYes) {
830 fni_.PushVariableName(name);
832 return expression_scope()->NewVariable(name, start_position);
836 int start_position) {
837 expression_scope()->Declare(name, start_position);
862 return factory()->NewExpressionStatement(
863 factory()->NewThrow(exception,
pos),
pos);
869 int initializer_end_position,
874 pattern, initializer, scanner()->location().beg_pos,
875 initializer_end_position, is_rest);
877 parameters->
params.Add(parameter);
884 for (
auto parameter : parameters->
params) {
885 bool is_optional = parameter->initializer() !=
nullptr;
891 is_simple ? parameter->name() : ast_value_factory()->empty_string(),
892 is_simple ? VariableMode::kVar : VariableMode::kTemporary,
893 is_optional, parameter->is_rest(), ast_value_factory(),
894 parameter->position);
899 void ReindexComputedMemberName(
Expression* computed_name);
900 void DeclareArrowFunctionFormalParameters(
913 void SetFunctionNameFromIdentifierRef(
Expression* value,
917 ++use_counts_[feature];
928 if (source_range_map_ ==
nullptr)
return;
933 source_range_map_->Find(binary_op));
934 if (ranges ==
nullptr)
return;
936 SourceRange range = ranges->GetRange(SourceRangeKind::kRight);
937 source_range_map_->Insert(
938 nary_op, zone()->New<NaryOperationSourceRanges>(zone(), range));
943 if (source_range_map_ ==
nullptr)
return;
946 if (ranges ==
nullptr)
return;
949 DCHECK_EQ(node->subsequent_length(), ranges->RangeCount());
953 int32_t continuation_position) {
954 if (source_range_map_ ==
nullptr)
return;
955 source_range_map_->Insert(
956 node, zone()->New<BlockSourceRanges>(continuation_position));
961 if (source_range_map_ ==
nullptr)
return;
962 source_range_map_->Insert(node,
963 zone()->New<CaseClauseSourceRanges>(body_range));
968 if (source_range_map_ ==
nullptr)
return;
971 source_range_map_->Find(node));
972 if (ranges ==
nullptr) {
973 source_range_map_->Insert(
974 node, zone()->New<ConditionalChainSourceRanges>(zone()));
977 source_range_map_->Find(node));
978 if (ranges ==
nullptr)
return;
980 DCHECK_EQ(node->conditional_chain_length(), ranges->RangeCount());
985 if (source_range_map_ ==
nullptr)
return;
988 source_range_map_->Find(node));
989 if (ranges ==
nullptr)
return;
996 if (source_range_map_ ==
nullptr)
return;
997 source_range_map_->Insert(
998 node->AsConditional(),
999 zone()->New<ConditionalSourceRanges>(then_range, else_range));
1003 if (source_range_map_ ==
nullptr)
return;
1004 source_range_map_->Insert(node, zone()->New<FunctionLiteralSourceRanges>());
1009 if (source_range_map_ ==
nullptr)
return;
1010 source_range_map_->Insert(
1011 node->AsBinaryOperation(),
1012 zone()->New<BinaryOperationSourceRanges>(right_range));
1016 int32_t continuation_position) {
1017 if (source_range_map_ ==
nullptr)
return;
1018 source_range_map_->Insert(
1020 zone()->New<JumpStatementSourceRanges>(continuation_position));
1026 if (source_range_map_ ==
nullptr)
return;
1027 source_range_map_->Insert(
1028 node->AsIfStatement(),
1029 zone()->New<IfStatementSourceRanges>(then_range, else_range));
1034 if (source_range_map_ ==
nullptr)
return;
1035 source_range_map_->Insert(
1036 node, zone()->New<IterationStatementSourceRanges>(body_range));
1042 if (source_range_map_ ==
nullptr)
return;
1043 source_range_map_->Insert(node,
1044 zone()->New<ExpressionSourceRanges>(right_range));
1048 int32_t continuation_position) {
1049 if (source_range_map_ ==
nullptr)
return;
1050 source_range_map_->Insert(
1052 zone()->New<SuspendSourceRanges>(continuation_position));
1056 Statement* node, int32_t continuation_position) {
1057 if (source_range_map_ ==
nullptr)
return;
1058 source_range_map_->Insert(
1059 node->AsSwitchStatement(),
1060 zone()->New<SwitchStatementSourceRanges>(continuation_position));
1064 int32_t continuation_position) {
1065 if (source_range_map_ ==
nullptr)
return;
1068 source_range_map_->Insert(
1069 throw_expr, zone()->New<ThrowSourceRanges>(continuation_position));
1074 if (source_range_map_ ==
nullptr)
return;
1075 source_range_map_->Insert(
1076 node, zone()->New<TryCatchStatementSourceRanges>(body_range));
1081 if (source_range_map_ ==
nullptr)
return;
1082 source_range_map_->Insert(
1083 node, zone()->New<TryFinallyStatementSourceRanges>(body_range));
1088 if (current_compile_hint == FunctionLiteral::kShouldLazyCompile) {
1092 return FunctionLiteral::kShouldEagerCompile;
1095 return current_compile_hint;
1105 return &preparse_data_buffer_;
1109 friend class PreParserZoneScope;
1123 friend class ParserTargetScope;
1128 int number_of_named_namespace_exports_ = 0;
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
@ kUseCounterFeatureCount
IterationStatement * AsIterationStatement()
void AddElseRange(const SourceRange &else_range)
void AddThenRanges(const SourceRange &range)
void MakeParametersNonSimple()
Variable * DeclareParameter(const AstRawString *name, VariableMode mode, bool is_optional, bool is_rest, AstValueFactory *ast_value_factory, int position)
Expression * expression() const
void AddRange(const SourceRange &range)
void CalculateEmitStore(Zone *zone)
ParsingModeScope(Parser *parser, Mode mode)
TemplateLiteral(Zone *zone, int pos)
void AddExpression(Expression *expression, Zone *zone)
ZonePtrList< Expression > expressions_
const ZonePtrList< Expression > * expressions() const
ZonePtrList< const AstRawString > raw_
const ZonePtrList< const AstRawString > * raw() const
const ZonePtrList< const AstRawString > * cooked() const
void AddTemplateSpan(const AstRawString *cooked, const AstRawString *raw, int end, Zone *zone)
ZonePtrList< const AstRawString > cooked_
Expression * RewriteSpreads(ArrayLiteral *lit)
bool AllowsLazyParsingWithoutUnresolvedVariables() const
V8_INLINE void AddFunctionForNameInference(FunctionLiteral *func_to_infer)
V8_INLINE Expression * NewThrowReferenceError(MessageTemplate message, int pos)
class ThisExpression * ThisExpression()
V8_INLINE bool IsConstructor(const AstRawString *identifier) const
V8_INLINE bool IsStringLiteral(Statement *statement, const AstRawString *arg=nullptr) const
Expression * RewriteSuperCall(Expression *call_expression)
static V8_INLINE void CheckAssigningFunctionLiteralToProperty(Expression *left, Expression *right)
std::vector< uint8_t > preparse_data_buffer_
V8_INLINE bool IsArguments(const AstRawString *identifier) const
V8_INLINE ZonePtrList< ClassLiteral::StaticElement > * NewClassStaticElementList(int size) const
static V8_INLINE bool IsArrayIndex(const AstRawString *string, uint32_t *index)
V8_INLINE void PushPropertyName(Expression *expression)
static V8_INLINE const AstRawString * AsIdentifier(Expression *expression)
class ThisExpression * NewThisExpression(int pos)
V8_INLINE void ReportUnidentifiableError()
V8_INLINE void RecordTryFinallyStatementSourceRange(TryFinallyStatement *node, const SourceRange &body_range)
bool IdentifierEquals(const AstRawString *identifier, const AstRawString *other)
static V8_INLINE ZonePtrList< Expression > * NullExpressionList()
V8_INLINE void DeclareIdentifier(const AstRawString *name, int start_position)
static V8_INLINE bool IsIdentifier(Expression *expression)
static V8_INLINE bool IsNull(T subject)
V8_INLINE VariableProxy * ExpressionFromPrivateName(PrivateNameScopeIterator *private_name_scope, const AstRawString *name, int start_position)
V8_INLINE void InferFunctionName()
ObjectLiteral * InitializeObjectLiteral(ObjectLiteral *object_literal)
V8_INLINE bool IsEmptyIdentifier(const AstRawString *subject) const
V8_INLINE void CountUsage(v8::Isolate::UseCounterFeature feature)
static V8_INLINE std::nullptr_t NullLiteralProperty()
V8_INLINE void GetDefaultStrings(const AstRawString **default_string, const AstRawString **dot_default_string)
V8_INLINE const AstRawString * GetSymbol() const
V8_INLINE void RecordBlockSourceRange(Block *node, int32_t continuation_position)
static V8_INLINE bool IsPrivateReference(Expression *expression)
void DeclareClassField(ClassScope *scope, ClassLiteralProperty *property, const AstRawString *property_name, bool is_static, bool is_computed_name, bool is_private, ClassInfo *class_info)
V8_INLINE Statement * NewThrowStatement(Expression *exception, int pos)
ScriptCompiler::CompileOptions compile_options_
V8_INLINE void RecordConditionalSourceRange(Expression *node, const SourceRange &then_range, const SourceRange &else_range)
V8_INLINE void RecordJumpStatementSourceRange(Statement *node, int32_t continuation_position)
static V8_INLINE std::nullptr_t NullStatement()
static V8_INLINE bool IsBoilerplateProperty(ObjectLiteral::Property *property)
Assignment * BuildCreateJSGeneratorObject(int pos, FunctionKind kind)
LocalIsolate * local_isolate_
V8_INLINE void PushVariableName(const AstRawString *id)
V8_INLINE v8::Extension * extension() const
Variable * NewTemporary(const AstRawString *name)
MaybeHandle< FixedArray > maybe_wrapped_arguments_
V8_INLINE bool ParsingDynamicFunctionDeclaration() const
V8_INLINE bool IsAsync(const AstRawString *identifier) const
ConsumedPreparseData * consumed_preparse_data_
V8_INLINE void RecordExpressionSourceRange(Expression *node, const SourceRange &right_range)
const AstRawString * GetRawNameFromIdentifier(const AstRawString *arg)
static bool IsPreParser()
V8_INLINE void RecordIfStatementSourceRange(Statement *node, const SourceRange &then_range, const SourceRange &else_range)
void ThrowPendingError(Isolate *isolate, Handle< Script > script)
V8_INLINE void AppendConditionalChainElseSourceRange(ConditionalChain *node, const SourceRange &range)
V8_INLINE void PushLiteralName(const AstRawString *id)
V8_INLINE void AppendNaryOperationSourceRange(NaryOperation *node, const SourceRange &range)
V8_INLINE void RecordIterationStatementSourceRange(IterationStatement *node, const SourceRange &body_range)
V8_INLINE bool IsNative(Expression *expr) const
void DeclareClassBrandVariable(ClassScope *scope, ClassInfo *class_info, int class_token_pos)
V8_INLINE void DeclareFormalParameters(ParserFormalParameters *parameters)
Expression * FailureExpression()
V8_INLINE bool ParsingExtension() const
V8_INLINE VariableProxy * ExpressionFromIdentifier(const AstRawString *name, int start_position, InferName infer=InferName::kYes)
V8_INLINE const AstRawString * GetIdentifier() const
V8_INLINE void RecordCaseClauseSourceRange(CaseClause *node, const SourceRange &body_range)
V8_INLINE void AppendConditionalChainSourceRange(ConditionalChain *node, const SourceRange &range)
V8_INLINE void AddFormalParameter(ParserFormalParameters *parameters, Expression *pattern, Expression *initializer, int initializer_end_position, bool is_rest)
V8_INLINE void RecordBinaryOperationSourceRange(Expression *node, const SourceRange &right_range)
void DeclareClassProperty(ClassScope *scope, const AstRawString *class_name, ClassLiteralProperty *property, bool is_constructor, ClassInfo *class_info)
static V8_INLINE bool IsIterationStatement(Statement *subject)
IterationStatement * AsIterationStatement(BreakableStatement *s)
static V8_INLINE bool IsThisProperty(Expression *expression)
static V8_INLINE std::nullptr_t NullExpression()
std::vector< uint8_t > * preparse_data_buffer()
static V8_INLINE ZonePtrList< Statement > * NullStatementList()
V8_INLINE Variable * DeclareCatchVariableName(Scope *scope, const AstRawString *name)
V8_INLINE const AstRawString * EmptyIdentifierString() const
static V8_INLINE std::nullptr_t NullIdentifier()
const AstRawString * PreParserIdentifierToAstRawString(const PreParserIdentifier &arg)
V8_INLINE const AstRawString * GetNumberAsSymbol() const
V8_INLINE VariableProxy * AsIdentifierExpression(Expression *expression)
V8_INLINE void RecordFunctionLiteralSourceRange(FunctionLiteral *node)
V8_INLINE void RecordSuspendSourceRange(Expression *node, int32_t continuation_position)
V8_INLINE bool IsEvalOrArguments(const AstRawString *identifier) const
bool parse_lazily() const
V8_INLINE const AstRawString * GetNextSymbol() const
V8_INLINE ZonePtrList< ClassLiteral::Property > * NewClassPropertyList(int size) const
V8_INLINE void RecordTryCatchStatementSourceRange(TryCatchStatement *node, const SourceRange &body_range)
V8_INLINE FunctionLiteral::EagerCompileHint GetEmbedderCompileHint(FunctionLiteral::EagerCompileHint current_compile_hint, int position)
static V8_INLINE std::nullptr_t NullBlock()
V8_INLINE void PushEnclosingName(const AstRawString *name)
int total_preparse_skipped_
V8_INLINE void RecordSwitchStatementSourceRange(Statement *node, int32_t continuation_position)
PreParser * reusable_preparser()
V8_INLINE bool IsEval(const AstRawString *identifier) const
PreParser * reusable_preparser_
V8_INLINE void RecordThrowSourceRange(Statement *node, int32_t continuation_position)
V8_INLINE void ConvertBinaryToNaryOperationSourceRange(BinaryOperation *binary_op, NaryOperation *nary_op)
void AddUnresolvedPrivateName(VariableProxy *proxy)
bool IsPrivateReference() const
Variable * DeclareCatchVariableName(const AstRawString *name)
bool is_new_target() const
RecordWriteMode const mode_
base::Vector< const DirectHandle< Object > > args
too high values may cause the compiler to set high thresholds for inlining to as much as possible avoid inlined allocation of objects that cannot escape trace load stores from virtual maglev objects use TurboFan fast string builder analyze liveness of environment slots and zap dead values trace TurboFan load elimination emit data about basic block usage in builtins to this enable builtin reordering when run mksnapshot flag for emit warnings when applying builtin profile data verify register allocation in TurboFan randomly schedule instructions to stress dependency tracking enable store store elimination in TurboFan rewrite far to near simulate GC compiler thread race related to allow float parameters to be passed in simulator mode JS Wasm Run additional turbo_optimize_inlined_js_wasm_wrappers enable experimental feedback collection in generic lowering enable Turboshaft s WasmLoadElimination enable Turboshaft s low level load elimination for JS enable Turboshaft s escape analysis for string concatenation use enable Turbolev features that we want to ship in the not too far future trace individual Turboshaft reduction steps trace intermediate Turboshaft reduction steps invocation count threshold for early optimization Enables optimizations which favor memory size over execution speed Enables sampling allocation profiler with X as a sample interval min size of a semi the new space consists of two semi spaces max size of the Collect garbage after Collect garbage after keeps maps alive for< n > old space garbage collections print one detailed trace line in allocation gc speed threshold for starting incremental marking via a task in percent of available threshold for starting incremental marking immediately in percent of available Use a single schedule for determining a marking schedule between JS and C objects schedules the minor GC task with kUserVisible priority max worker number of concurrent for NumberOfWorkerThreads start background threads that allocate memory concurrent_array_buffer_sweeping use parallel threads to clear weak refs in the atomic pause trace progress of the incremental marking trace object counts and memory usage report a tick only when allocated zone memory changes by this amount TracingFlags::gc_stats TracingFlags::gc_stats track native contexts that are expected to be garbage collected verify heap pointers before and after GC memory reducer runs GC with ReduceMemoryFootprint flag Maximum number of memory reducer GCs scheduled Old gen GC speed is computed directly from gc tracer counters Perform compaction on full GCs based on V8 s default heuristics Perform compaction on every full GC Perform code space compaction when finalizing a full GC with stack Stress GC compaction to flush out bugs with moving objects flush of baseline code when it has not been executed recently Use time base code flushing instead of age Use a progress bar to scan large objects in increments when incremental marking is active force incremental marking for small heaps and run it more often force marking at random points between and force scavenge at random points between and reclaim otherwise unreachable unmodified wrapper objects when possible less compaction in non memory reducing mode use high priority threads for concurrent Marking Test mode only flag It allows an unit test to select evacuation candidates use incremental marking for CppHeap cppheap_concurrent_marking c value for membalancer A special constant to balance between memory and space tradeoff The smaller the more memory it uses enable use of SSE4 instructions if available enable use of AVX VNNI instructions if available enable use of POPCNT instruction if available force all emitted branches to be in long mode(MIPS/PPC only)") DEFINE_BOOL(partial_constant_pool
other heap size flags(e.g. initial_heap_size) take precedence") DEFINE_SIZE_T( max_shared_heap_size
ZoneVector< RpoNumber > & result
FunctionLiteral * literal
bool ParseFunction(ParseInfo *info, DirectHandle< SharedFunctionInfo > shared_info, Isolate *isolate, ReportStatisticsMode mode)
bool ParseProgram(ParseInfo *info, DirectHandle< Script > script, MaybeDirectHandle< ScopeInfo > maybe_outer_scope_info, Isolate *isolate, ReportStatisticsMode mode)
constexpr int kNoSourcePosition
std::string_view DoubleToStringView(double v, base::Vector< char > buffer)
bool(*)(int, void *) CompileHintCallback
OptimizedCompilationInfo * info_
RegExpParserImpl< CharT > *const parser_
const uintptr_t stack_limit_
#define NON_EXPORTED_BASE(code)
#define DCHECK_NOT_NULL(val)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_EXPORT_PRIVATE
const AstRawString * local_name
const AstRawString * export_name
Scanner::Location location
NamedImport(const AstRawString *import_name, const AstRawString *local_name, Scanner::Location location)
const AstRawString * local_name
const AstRawString * import_name
const Scanner::Location location
static Location invalid()
#define V8_WARN_UNUSED_RESULT
std::unique_ptr< ValueMirror > key